// src/main/java/com/example/drcbackend/controller/ConsistencyController.java
package com.example.drcbackend.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.drcbackend.Mapper.DbMapper;
import com.example.drcbackend.Mapper.SubsetdbMapper;
import com.example.drcbackend.entity.Db;
import com.example.drcbackend.entity.Subsetdb;
import com.example.drcbackend.entity.User;
import com.example.drcbackend.jwt.Result;
import com.example.drcbackend.service.ConsistencyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@CrossOrigin
@RestController
@RequestMapping("/consistency")
public class ConsistencyController {

    private static final Logger logger = LoggerFactory.getLogger(ConsistencyController.class);

    @Autowired
    private ConsistencyService consistencyService;
    @Autowired
    private DbMapper dm;
    @Autowired
    private SubsetdbMapper sm;

    @PostMapping("/consistency_check")
    public Result consistency_check(int DBid) {
        Map<String, Object> resultData = new HashMap<>(); // 用于存放最终返回的数据
        List<String> logs = new ArrayList<>(); // 用于存放日志信息

        try {
            // 调用一致性检测服务
            boolean isConsistent = consistencyService.checkConsistency(DBid, logs);
            if(isConsistent==true){
                LambdaQueryWrapper<Db> lqw = new LambdaQueryWrapper<>();
                lqw.eq(Db::getDbid,DBid);
                Db db=dm.selectOne(lqw);
                db.setConsistency(1);// 数据库一致
                dm.updateById(db);
            }

            // 将一致性结果和日志信息封装到 resultData 中
            resultData.put("consistent", isConsistent);
            resultData.put("logs", logs);

            // 返回成功响应，将 resultData 放入 data 字段
            return Result.ok()
                    .data("result", resultData) // 将数据封装到 result 字段
                    .message("一致性检测完成");
        } catch (NumberFormatException e) {
            logs.add("错误: DBid必须为数字");
            resultData.put("consistent", false);
            resultData.put("logs", logs);

            // 返回错误响应，将 resultData 放入 data 字段
            return Result.error()
                    .data("result", resultData) // 将数据封装到 result 字段
                    .message("DBid必须为数字");
        } catch (IllegalArgumentException e) {
            logs.add("错误: " + e.getMessage());
            resultData.put("consistent", false);
            resultData.put("logs", logs);

            // 返回错误响应，将 resultData 放入 data 字段
            return Result.error()
                    .data("result", resultData) // 将数据封装到 result 字段
                    .message(e.getMessage());
        } catch (IOException e) {
            logs.add("错误: 文件读取失败: " + e.getMessage());
            resultData.put("consistent", false);
            resultData.put("logs", logs);

            // 返回错误响应，将 resultData 放入 data 字段
            return Result.error()
                    .data("result", resultData) // 将数据封装到 result 字段
                    .message("文件读取失败: " + e.getMessage());
        } catch (Exception e) {
            logs.add("错误: 服务器内部错误: " + e.getClass().getSimpleName());
            resultData.put("consistent", false);
            resultData.put("logs", logs);

            // 返回错误响应，将 resultData 放入 data 字段
            return Result.error()
                    .data("result", resultData) // 将数据封装到 result 字段
                    .message("服务器内部错误: " + e.getClass().getSimpleName());
        }
    }
    @PostMapping("/subconsistency_check")
    public Result subconsistency_check(int setid) {
        Map<String, Object> resultData = new HashMap<>(); // 用于存放最终返回的数据
        List<String> logs = new ArrayList<>(); // 用于存放日志信息
        Subsetdb set=sm.selectById(setid);
        int DBid=dm.selectById(set.getSetdbid()).getDbid();// 这里是子集的序号

        try {
            // 调用一致性检测服务
            boolean isConsistent = consistencyService.checksubConsistency(DBid, logs);
            if(isConsistent==true){
                LambdaQueryWrapper<Db> lqw = new LambdaQueryWrapper<>();
                lqw.eq(Db::getDbid,DBid);
                Db db=dm.selectOne(lqw);
                db.setConsistency(1);// 数据库一致
                dm.updateById(db);
            }

            // 将一致性结果和日志信息封装到 resultData 中
            resultData.put("consistent", isConsistent);
            resultData.put("logs", logs);

            // 返回成功响应，将 resultData 放入 data 字段
            return Result.ok()
                    .data("result", resultData) // 将数据封装到 result 字段
                    .message("一致性检测完成");
        } catch (NumberFormatException e) {
            logs.add("错误: DBid必须为数字");
            resultData.put("consistent", false);
            resultData.put("logs", logs);

            // 返回错误响应，将 resultData 放入 data 字段
            return Result.error()
                    .data("result", resultData) // 将数据封装到 result 字段
                    .message("DBid必须为数字");
        } catch (IllegalArgumentException e) {
            logs.add("错误: " + e.getMessage());
            resultData.put("consistent", false);
            resultData.put("logs", logs);

            // 返回错误响应，将 resultData 放入 data 字段
            return Result.error()
                    .data("result", resultData) // 将数据封装到 result 字段
                    .message(e.getMessage());
        } catch (IOException e) {
            logs.add("错误: 文件读取失败: " + e.getMessage());
            resultData.put("consistent", false);
            resultData.put("logs", logs);

            // 返回错误响应，将 resultData 放入 data 字段
            return Result.error()
                    .data("result", resultData) // 将数据封装到 result 字段
                    .message("文件读取失败: " + e.getMessage());
        } catch (Exception e) {
            logs.add("错误: 服务器内部错误: " + e.getClass().getSimpleName());
            resultData.put("consistent", false);
            resultData.put("logs", logs);

            // 返回错误响应，将 resultData 放入 data 字段
            return Result.error()
                    .data("result", resultData) // 将数据封装到 result 字段
                    .message("服务器内部错误: " + e.getClass().getSimpleName());
        }
    }

}
